package main

func main() {

}

/*
*
给你一个整数数组 nums ，请你找出数组中乘积最大的非空连续 子数组
（该子数组中至少包含一个数字），并返回该子数组所对应的乘积。

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
*/

/*
*
思考：
对于连续的数的最大值，只考虑非负数的情况的话
每个数字可以选择乘或者不乘上一个数字的得到的连续最大乘积，
因为有0的存在，选择不乘反而是最大值

对于有负数的情况，则是乘一个最小值反而是最大值了
所以每个数字都要累计得到最大值和最小值
*/
func maxProduct(nums []int) int {
	maxNum := nums[0]
	minNum := nums[0]
	ans := nums[0]
	for i := 1; i < len(nums); i++ {
		// 当前最大值 = 当前数字*前一个数字的累计最大值，或者  当前数字， 或者 当前数字*前一个数字的累计最小值
		// 当前最小值 = 当前数字*前一个数字的累计最小值，或者 当前数字，或者 当前数字*前一个数字的累计最大值
		maxNum, minNum = max(nums[i]*maxNum, max(nums[i], minNum*nums[i])), min(nums[i]*minNum, min(nums[i], maxNum*nums[i]))
		// 记录最大值
		ans = max(maxNum, ans)
	}
	return ans
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func min(a, b int) int {
	if a > b {
		return b
	}
	return a
}
